home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / select / select.006 < prev    next >
Text File  |  1995-02-07  |  5KB  |  223 lines

  1. /*
  2.   r.m=80 tab=4
  3.     =======================================================================
  4.    ==  <<バッチ分岐支援プログラム>>                                       ==
  5.    ==      [ select.exe ]      Ver 0.06                                   ==
  6.    ==                                     1995      Program : Y.Gotoh     ==
  7.     =======================================================================
  8. */
  9.  
  10. /*外部ファイル読み込み */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <conio.h>
  16. #include <ctype.h>
  17. #include "gotoh.h"
  18.  
  19. /* グローバル変数の設定 */
  20.  
  21. char *sel[20];        /* select群で使用 */
  22. int end_echo=1;        /* エンディングエコーの表示非表示。初期(1)は表示 */
  23.  
  24. /* 関数の定義 */
  25.  
  26. void waitkey( int wait_time);
  27.  
  28. int select(int sel_max);
  29. void select_list(int sel_max);
  30. void select_prt(int sel_no,int sel_bak);
  31.  
  32. /* メイン */
  33.  
  34. int main(int argc , char *argv[])
  35. {
  36.     int ret,sel_max,i,j;
  37.     
  38.     txt_cls();
  39.     txt_csloff();
  40.     locate(20,1);
  41.         txt_color(3);
  42.         printf(    "------------------------------------------\n");
  43.     locate(20,2);
  44.         printf(    " [select,exe]     1995 program : Y.Gotoh \n");
  45.     locate(20,3);
  46.         printf(    "------------------------------------------\n");
  47.     txt_color(7);
  48.     
  49.     if(
  50.         argc <= 2
  51.         || ( (*argv[1]=='-' || *argv[1]=='/')
  52.              && (*(argv[1]+1)=='h' || *(argv[1]+1)=='H') )
  53.         )                                    /* パラメータ無しまたは選択肢が */
  54.                                             /* 1つも無いもしくは/hオプショ */
  55.                                             /* ンが有る時はヘルプを表示 */
  56.     {
  57.         printf(
  58.         "             \"select.exe\"  Ver 0.06      1995 : Y.Gotoh (Gori)\n"
  59.         "\n"
  60.         "  select.exe [option] title sel_1 sel_b sel_c ・・・\n"
  61.         "       /h -h ・・・ Help             ヘルプを表示します.\n"
  62.         "       /e -e ・・・ not Eending echo 終了時メッセージを表示しません.\n"
  63.         "\n"
  64.         "  ==メニューの使い方==\n"
  65.         "      [↑],[F],[f]   ・・・・・・・・・・  カーソルを上へ移動\n"
  66.         "      [↓],[J],[j]   ・・・・・・・・・・       〃   下  〃  \n"
  67.         "     [ret],[space]   ・・・・・・・・・・  決定\n"
  68.         "         [0~9]      ・・・・・・・・・・  その番号のメニューを実行\n"
  69.         "     [esc],[Q],[q]   ・・・・・・・・・・  終了\n\n"
  70.         );
  71.         exit(0);
  72.     }
  73.     sel_max=argc-2;                                    /* sel_maxに選択肢の仮の
  74.                                                                 個数を代入 */
  75.     
  76.     /* 第1パラメータのタイトル・パラメータ識別 */
  77.     if( (*argv[1]=='-' || *argv[1]=='/')
  78.         && (*(argv[1]+1)=='e' || *(argv[1]+1)=='E') )
  79.     {
  80.         end_echo=0;                        /* エンディングエコーを表示しない */
  81.         sel_max--;                        /* パラメータの分選択肢の数を減らす */
  82.         for(i=0;i<=sel_max;i++)
  83.         {                                            /* パラメータ分ずらした */
  84.             sel[i]=argv[i+2];                                /* 配列の複写 */
  85.         }
  86.     }
  87.     else
  88.     {
  89.         for(i=0;i<=sel_max;i++)
  90.         {
  91.             sel[i]=argv[i+1];                                /* 配列の複写 */
  92.         }
  93.     }
  94.     
  95.     for(i=0;i<=sel_max;i++)
  96.     {
  97.     
  98.         for(j=0;j<strlen(sel[i]);j++)                    /* アンダーバーをス */
  99.         {                                                /* ペースに変換する。 */
  100.             if( *(sel[i]+j)=='_' )
  101.             {
  102.                 *(sel[i]+j)=' ';
  103.             }
  104.         }
  105.     }
  106.     
  107.     ret=select(sel_max);                                /* 選択ルーチンへ */
  108.     if(ret==-1)    ret=0;                    /* エスケープ終了は通常終了にする */
  109.     
  110.     txt_cls();
  111.     if(end_echo)                    /* end_echo が 0 以外ならメッセージ表示 */
  112.     {
  113.         printf(    "[select.exe] Ver 0.06  program : Y.Gotoh\n"
  114.                 "    returned error level [%d]\n",ret);
  115.     }
  116.     txt_cslon();
  117.     exit(ret);
  118. }
  119.  
  120. /* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
  121. int select(int sel_max)
  122. {
  123.     int sel_no=1,sel_bak=1,ret=0;
  124.     char key='\0';                            /* とりあえずループさせるために */
  125.     
  126.     locate(20,5);
  127.         printf("%s\n",sel[0]);                        /* メニュータイトル表示 */
  128.     
  129.     select_list(sel_max);                                        /* 一覧表示 */
  130.     select_prt(sel_no,sel_bak);            /* 初期位置(1)にカーソルを持ってくる */
  131.     
  132.     do
  133.     {
  134.         key=getch();
  135.         key=tolower(key);
  136.         
  137.         /* [↑,F,f]の時 */
  138.         if(key=='\x1e' || key=='\x66')
  139.         {
  140.             sel_bak=sel_no;
  141.             sel_no--;
  142.             if(sel_no<1) sel_no=sel_max;
  143.             select_prt(sel_no,sel_bak);
  144.         }
  145.         
  146.         /* [↓,J,j]の時 */
  147.         if(key == '\x1f' || key=='\x6a')
  148.         {
  149.             sel_bak=sel_no;
  150.             sel_no++;
  151.             if(sel_no>sel_max) sel_no=1;
  152.             select_prt(sel_no,sel_bak);
  153.         }
  154.         
  155.         /* 各数字(0~9)が押された時 */
  156.         if(key >= '\x30' && key <= '\x39')
  157.         {
  158.             sel_bak=sel_no;
  159.             sel_no=(int)key-0x30;
  160.             if(sel_no==0) sel_no=10;
  161.             if(sel_no>sel_max)
  162.             {
  163.                 sel_no=sel_bak;
  164.             }
  165.             else
  166.             {
  167.                 select_prt(sel_no,sel_bak);
  168.                 waitkey(20);
  169.                 key='\x0d';
  170.             }
  171.         }
  172.     }while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
  173.     
  174.     if(key == '\x0d' || key == '\x20' )    ret=sel_no;    /* [space],[ret]なら
  175.                                                             選択番号を返す */
  176.     if(key == '\x71')    ret=0;                    /* [Q],[q]なら終了(ret=0) */
  177.     if(key == '\x1b')    ret=-1;                        /* [esc]なら-1を返す */
  178.     
  179.     return(ret);
  180. }
  181.  
  182. /* 選択肢一覧表示 */
  183. void select_list(int sel_max)
  184. {
  185.     int i;
  186.     
  187.     for(i=1;i<=sel_max;i++)
  188.     {
  189.         locate(19,i+6);
  190.         if(i<10)    printf("%1d: %s",i,sel[i]);
  191.             else    printf("%d: %s",i-10,sel[i]);    /* 10は、0と表示する */
  192.     }
  193. }
  194.  
  195. /* 選択カーソル表示ルーチン */
  196. void select_prt(int sel_no,int sel_bak)
  197. {
  198.     locate(19,sel_bak+6);                        /* 黄色の帯を消す */
  199.     if(sel_bak<10){
  200.         printf("%1d: %s",sel_bak,sel[sel_bak]);
  201.     }
  202.     else    printf("%1d: %s",sel_bak-10,sel[sel_bak]);    /* 10は0に */
  203.     
  204.     locate(19,sel_no+6);                            /* 新しく帯を引く */
  205.     if(sel_no<10){
  206.         printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no,sel[sel_no]);
  207.     }
  208.     else    printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no-10,sel[sel_no]);
  209. }
  210.  
  211. /* サブルーチン */
  212.  
  213. /* 何かキーを押すか一定時間経つと処理を復帰するサブ */
  214. void waitkey(int wait_time)
  215. {
  216.     int i=0;
  217.     
  218.     for(i=0;i<wait_time*10;i++)
  219.     {
  220.         if( kbhit() != 0)    break;
  221.     }
  222. }
  223.